/*
链表
*/
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
// #define DEBUG
const int N=3e5+10, INF=0x3f3f3f3f;
struct drop
{
    int realpos; //实际位置
    int val; //当前有多少水
    int l, r; //左右有水的地方
    bool operator<(drop d)
    {
        return realpos<d.realpos;
    }
}drops[N]; //只存储有水的地方 下标为离散化位置
map<int, int> idx; //实际位置 离散化位置
//vector<drop> drops; 
priority_queue<int, vector<int>, greater<int>> op; //待处理队列 只能存下标(待处理离散化位置)
bool boom[N]; //是否已爆炸 离散位置
int len, m, ops, ans; //[1, len, N]

inline void printnode(int u)
{
    printf("drops[%d]: %d %d %d %d\n", u, drops[u].realpos, drops[u].val, drops[u].l, drops[u].r);
}

inline void printall()
{
    for(int i=1; i<=m; i++)
        printnode(i);
    puts("");
}

inline void printmap()
{
    for(auto [realid, disid] : idx)
        printf("mp[%d, %d]\n", realid, disid);
}

void del(drop& u)
{
    drops[u.l].r=u.r;
    drops[u.r].l=u.l;
    u.l=u.r=u.val=u.realpos=0;
}

void solve() //处理待处理队列
{
    while(op.size())
    {
        int pos=op.top(); op.pop(); //离散化位置
        auto &u=drops[pos];
        u.val=0;

        if(1<=u.l && !boom[u.l] && ++drops[u.l].val>=5) 
            boom[u.l]=1, op.push(u.l);//, inq[u.l]=1;
        if(u.r<=m && !boom[u.r] && ++drops[u.r].val>=5) 
            boom[u.r]=1, op.push(u.r);//, inq[u.r]=1;
        del(u), ans--; //有一个水滴爆了 

        // printall(); 
        // puts("");
    }
}

signed main()
{
    #ifdef DEBUG
        freopen("../in.txt", "r", stdin);
        freopen("../out.txt", "w", stdout);
    #endif

    cin >> len >> m >> ops; 
    ans=m;

    for(int i=1; i<=m; i++)
    {
        cin >> drops[i].realpos >> drops[i].val;
    }
    
    sort(drops+1, drops+1+m);

    for(int i=1; i<=m; i++)
    {
        drops[i].l=i-1; //离散位置
        drops[i].r=i+1;  
        idx[drops[i].realpos]=i; 
    }

    // drops[m].r=INF;

    for(int i=1; i<=ops; i++)
    {
        int realpos; cin >> realpos;
        int pos=idx[realpos]; //找到在数组中的离散化位置

        drops[pos].val++;

        if(!boom[pos] && drops[pos].val>=5){
            op.push(pos);
            boom[pos]=1;
            solve();
        }
        printf("%d\n", ans);
    }

    return 0;
}
/*
10000000 5 2
10 2
100 4
10000 4
100000 4
1000000 2
10000
10
*/